import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
/**
 * Clase a partir de la cual se crea el personaje principal del juego, la cual contiene los diferentes metodos con los cual actuara
 * 
 * @author Omar Espino
 * @version 11/11/2014
 */
public class Popo extends Actor
{
    private GreenfootImage []caminaDerecha;
    private GreenfootImage []caminaIzquierda;
    private GreenfootImage []golpeaDerecha;
    private GreenfootImage []golpeaIzquierda;
    private GreenfootImage camina0;
    private GreenfootImage camina1;
    private GreenfootImage camina2;
    private GreenfootImage camina3;
    private GreenfootImage camina4;
    private GreenfootImage camina5;
    private GreenfootImage brincaDer;
    private GreenfootImage brincaIzq;

    private int contadorCaminaDer;
    private int contadorCaminaIzq;
    private int direccionPopo;
    private int velocidadCaminar;
    public final int IZQUIERDA=0;
    public final int DERECHA=1;

    private SimpleTimer relojPopo;
    private SimpleTimer controlCuchillos;
    private SimpleTimer controlBrinco;

    private boolean tengoLlave;
    private boolean tengoLlave2;

    private boolean desbugGolpe;

    private int cantCuchillos;
    private int cantBombas;
    private int jumps;

    private int numFocasMuertas;
    private int numOsosMuertos;
    private int numTerodactilosMuertos;

    private GreenfootSound sonidoBrinco;
    private GreenfootSound martillazo;
    private GreenfootSound muerto;
    private GreenfootSound pasarnivel;
    public final GreenfootSound cuchillazo=new GreenfootSound("cuchillazo.wav");

    /**Constructor del personaje principal, donde se inician todas las imagenes del personaje y variables que se necesitan durante el juego*/
    public Popo()
    {
        caminaDerecha=new GreenfootImage[3];
        caminaIzquierda=new GreenfootImage[3];

        camina0=new GreenfootImage("camina1derecha.png");
        camina1=new GreenfootImage("camina2derecha.png");
        camina2=new GreenfootImage("camina3derecha.png");
        camina3=new GreenfootImage("camina1izquierda.png");
        camina4=new GreenfootImage("camina2izquierda.png");
        camina5=new GreenfootImage("camina3izquierda.png");
        brincaDer=new GreenfootImage("brincader.png");
        brincaIzq=new GreenfootImage("brincaizq.png");

        caminaDerecha[0]=camina0;
        caminaDerecha[1]=camina1;
        caminaDerecha[2]=camina2;
        caminaIzquierda[0]=camina3;
        caminaIzquierda[1]=camina4;
        caminaIzquierda[2]=camina5;

        contadorCaminaDer=0;
        contadorCaminaIzq=0;
        direccionPopo=1;
        velocidadCaminar=3;
        relojPopo=new SimpleTimer();
        controlBrinco=new SimpleTimer();
        
        sonidoBrinco=new GreenfootSound("brinco.wav");
        sonidoBrinco.setVolume(70);
        martillazo=new GreenfootSound("martillazo.wav");
        martillazo.setVolume(70);
        muerto=new GreenfootSound("muerto.wav");
        muerto.setVolume(80);
        pasarnivel=new GreenfootSound("pasarnivel.wav");
        pasarnivel.setVolume(70);
        cuchillazo.setVolume(70);
        
        desbugGolpe=true;
        cantCuchillos=0;
        cantBombas=0;
        controlCuchillos=new SimpleTimer();
        controlCuchillos.mark();

        tengoLlave=false;
        tengoLlave2=false;
        numFocasMuertas=0;
        numOsosMuertos=0;
        numTerodactilosMuertos=0;
    }

    /** metodo que llama greenfoot automaticamente para actuar*/

    public void act() 
    {
        //checaAccion();

    }   

    /**metodo para mover la posicion del personaje a la derecha con su respectiva animacion*/
    public void caminaDerecha()
    {
        if(direccionPopo==DERECHA)
        {
            setImage(caminaDerecha[contadorCaminaDer]);
        }

        if(isTouching(Baseder.class)!=true)
        {
            setLocation(getX()+velocidadCaminar,getY());
        }

        if(contadorCaminaDer<2)
        {
            contadorCaminaDer++;  
        }
        else
        {
            contadorCaminaDer=0;
        }

        direccionPopo=DERECHA;

    }

    /**metodo para mover la posicion del personaje a la izquierda con su respectiva animacion*/
    public void caminaIzquierda()
    {
        if(direccionPopo==IZQUIERDA)
        {
            setImage(caminaIzquierda[contadorCaminaIzq]) ;  
        }

        if(isTouching(Baseizq.class)!=true)
        {
            setLocation(getX()-velocidadCaminar,getY());
        }

        if(contadorCaminaIzq<2)
        {
            contadorCaminaIzq++;  
        }
        else
        {
            contadorCaminaIzq=0;
        }

        direccionPopo=IZQUIERDA;
    }

    /**metodo para hacer las animaciones del golpe del martillo a la izquierda y derecha*/
    public void golpea()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();

        if(direccionPopo==IZQUIERDA)
        {  
            mundo.getMartillo().setRotation(270);
            mundo.getMartillo().setLocation(getX()-25,getY()+5);
        }

        if(direccionPopo==DERECHA)
        {
            mundo.getMartillo().setRotation(90);
            mundo.getMartillo().setLocation(getX()+23,getY()+5);
        }
    }

    /**metodo para checar las acciones que puede hacer el personaje*/
    public void checaAccion()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();

        desbugGolpe=true;
        agarraCuchillos();
        agarraBombas();
        eliminaLadrillo();
        //dead();

        
        if(puedeCaer()==false)
        {
            caer();
        }

        if(direccionPopo==DERECHA)
        {
            setImage(caminaDerecha[0]);
        }
        else
        {
            setImage(caminaIzquierda[0]);
        }

        if(Greenfoot.isKeyDown("left"))
        {
            desbugGolpe=false;
            caminaIzquierda();  
        }

        if(Greenfoot.isKeyDown("right"))
        {
            desbugGolpe=false;
            caminaDerecha();  
        }

        if(mundo.getEtapa()==2)
        {   
            if(controlBrinco.millisElapsed()>200)
            {
                if(Greenfoot.isKeyDown("up"))
                {
                    if(isTouching(Ladrillo3.class) || isTouching(Ladrillo4.class) || isTouching(Ladrillo5.class) || isTouching(Ladrillo6.class) ||  isTouching(Ladrillo8.class) || isTouching(Plataforma.class) ||  isTouching(Ladrillo9.class))
                    {
                        brincar();
                        sonidoBrinco.play();
                    }

                    controlBrinco.mark();
                }

            }
        }

        if(mundo.getEtapa()==1)
        {
            if(Greenfoot.isKeyDown("up"))
            {
                if(isTouching(Ladrillo3.class) || isTouching(Ladrillo4.class) || isTouching(Ladrillo5.class) )
                {
                    brincar();
                    sonidoBrinco.play();
                }

            }
        }

        if(mundo.getEtapa()==3)
        {  if(controlBrinco.millisElapsed()>200)
            {
                if(Greenfoot.isKeyDown("up"))
                {
                    if(isTouching(Bloque.class) )
                    {
                        setLocation(getX(),getY()-90);
                        sonidoBrinco.play();
                    }
                    controlBrinco.mark();
                }
            }
        }

        if(desbugGolpe==true)
        {
            if(Greenfoot.isKeyDown("space"))
            {
                golpea();
                matarFocaPorMartillo();
                matarOsoPorMartillo();
            }
        }

        if(Greenfoot.isKeyDown("space")!=true)
        {
            if(direccionPopo==DERECHA)
            {
                mundo.getMartillo().setRotation(0);
                mundo.getMartillo().setLocation(getX()+12,getY()-10);
            }
            else
            {
                mundo.getMartillo().setRotation(0);
                mundo.getMartillo().setLocation(getX()-12,getY()-10);  
            }
        }

        if(Greenfoot.isKeyDown("Enter"))
        {
            if((mundo.getCartelCuchillos().getValue()!=0))
            {
                if(controlCuchillos.millisElapsed()>500)
                {
                    cuchillazo.play();
                    Kunai unKunai=new Kunai();
                    if(direccionPopo==DERECHA)
                    {
                        unKunai.setRotation(0);
                        getWorld().addObject(unKunai,getX()+10,getY());
                    }
                    if(direccionPopo==IZQUIERDA)
                    {
                        unKunai.setRotation(180);
                        getWorld().addObject(unKunai,getX()-10,getY());
                    }
                    if(Greenfoot.isKeyDown("w"))
                    {
                        unKunai.setRotation(270);
                        getWorld().addObject(unKunai,getX(),getY()-5);
                    }
                    mundo.getCartelCuchillos().add(-1);
                    controlCuchillos.mark();
                }
            }
        }

        if(Greenfoot.isKeyDown("p"))
        {
            if((mundo.getCartelBombas().getValue()!=0))
            {
                if(controlCuchillos.millisElapsed()>1000)
                {

                    if(direccionPopo==DERECHA)
                    {
                        Bomba unaBomba=new Bomba(1);
                        getWorld().addObject(unaBomba,getX()+10,getY());
                    }
                    if(direccionPopo==IZQUIERDA)
                    {
                        Bomba unaBomba=new Bomba(0);
                        getWorld().addObject(unaBomba,getX()-10,getY());
                    }

                    mundo.getCartelBombas().add(-1);
                    controlCuchillos.mark();
                }
            } 
        }

        if(Greenfoot.isKeyDown("q") && tengoLlave==true) 
        {
            if(mundo.getEtapa()==1)
            {
                pasarnivel.play();
                borraMundo();
            }
        }

        if(Greenfoot.isKeyDown("q") && tengoLlave2==true)
        {
            if(mundo.getEtapa()==2)
            {
                pasarnivel.play();
                borraMundo2();
            }
        }
    } 

    /**metodo para recojer los cuchillos que se encuentren tirados en el suelo*/
    public void agarraCuchillos()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();
        if(isTouching(Cuchillos.class))
        {
            Cuchillos pack1=(Cuchillos)getOneIntersectingObject(Cuchillos.class);
            if(getX()<=pack1.getX()+5 && getX()>=pack1.getX()-5)
            {
                cantCuchillos=Greenfoot.getRandomNumber(4)+1;
                getWorld().removeObject(pack1);
                mundo.getCartelCuchillos().add(cantCuchillos);
            }
        }
    }

    /**metodo para recojer caja de bombas que haya tiradas*/
    public void agarraBombas()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();
        if(isTouching(Bombas.class))
        {
            Bombas pack=(Bombas)getOneIntersectingObject(Bombas.class);
            if(getX()<=pack.getX()+10 && getX()>=pack.getX()-10 && getY()>=pack.getY()-10 && getY() <=pack.getY()+10)
            {
                cantBombas=Greenfoot.getRandomNumber(3)+1;
                getWorld().removeObject(pack);
                mundo.getCartelBombas().add(cantBombas);
            }
        }
    }

    /** metodo para matar una foca y para ver si la foca muerta dropea un pack de cuchillos*/
    public void matarFocaPorMartillo()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();

        // if(mundo.getMartillo().takeMonster())
        if(mundo.getMartillo().isTouching(Foca.class))
        {
            martillazo.play();
            int x,y;
            Foca foca1=(Foca)mundo.getMartillo().getOneIntersectingObject(Foca.class);
            x=foca1.getX();
            y=foca1.getY();

            getWorld().removeObject(foca1);
            mundo.getCartelPuntos().add(50);
            if(Greenfoot.getRandomNumber(2)==1)
            {
                Cuchillos pack=new Cuchillos();
                getWorld().addObject(pack,x,y);
            }
            numFocasMuertas+=1;
        }

    }

    /**metodo para romper un ladrillo*/
    public void eliminaLadrillo()
    {
        if(isTouching(Ladrillo.class))
        {
            Ladrillo lad=(Ladrillo)getOneIntersectingObject(Ladrillo.class);
            if(getX()<=lad.getX()+15 && getX()>=lad.getX()-15&& getY()-18<=lad.getY()+15 && getY()-18>=lad.getY()-15)
            {
                getWorld().removeObject(lad);
            }
        }  

    }

    /**metodo para que maten al personaje*/
    /**@return regresa un booleano true si el personaje a muerto por los enemigos o sus ataque*/
    public boolean dead()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();
        if(isTouching(Enemigo.class) || isTouching(Bolanieve.class) || isTouching(Hielo.class) )
        {
            muerto.play();
            mundo.getCartelVidas().add(-1); 
            return true;//setLocation(mundo.getWidth()/2,mundo.NIVEL1);
        }
        return false;
    }

    /**meotodo para que brinque el personaje a una cierta altura*/
    public void brincar()
    {
        setLocation(getX(),getY()-80);
    }

    /**metodo para que caiga el jugador*/
    public void caer()
    {
        setLocation(getX(),getY()+5);
    }

    /**metodo para entrar ala puerta*/
    /**@param regresa un booleano true en casi de que este en posicion de abrir la puerta a los siguientes niveles y false en caso contrario*/
    public boolean entraPuerta()
    {
        if(isTouching(Puerta.class))
        {
            Puerta puerta1=(Puerta)getOneIntersectingObject(Puerta.class);

            if(getX()<=puerta1.getX()+20 && getX()>=puerta1.getX()-20)
            {
                return true;    
            }
        }
        return false;
    }
    /**metodo para la gravedad del personaje*/
    /**@param regresa un booleano true en caso de que no pueda caer y false en caso contrario*/
    public boolean puedeCaer()
    {
        if(isTouching(Ladrillo.class)|| isTouching(Bloque.class) || isTouching(Ladrillo2.class) || isTouching(Ladrillo3.class) || isTouching(Ladrillo4.class) || isTouching(Ladrillo5.class) || isTouching(Ladrillo6.class) || isTouching(Ladrillo8.class) || isTouching(Ladrillo9.class))
        {
            return true;
        }
        return false; 
    }
    /**metodo que regresa en que nivel esta el jugador*/
    /**@return regresa un entero int de acuerdo al nivel que se encuentre el jugador*/
    public int nivel()
    {
        if(isTouching(Ladrillo.class))
        {
            return 1;
        }
        if(isTouching(Ladrillo2.class))
        {
            return 2;
        }
        if(isTouching(Ladrillo3.class))
        {
            return 3;
        }
        if(isTouching(Ladrillo4.class))
        {
            return 4;
        }
        if(isTouching(Ladrillo5.class))
        {
            return 5;
        }
        if(isTouching(Ladrillo6.class))
        {
            return 6;
        }
        if(isTouching(Ladrillo8.class))
        {
            return 8;
        }
        if(isTouching(Ladrillo9.class))
        {
            return 9;
        }

        return 0;
    }

    /**metodo para matar osos por medio del martillo*/
    public void matarOsoPorMartillo()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();

        if(mundo.getMartillo().isTouching(Osopolar.class))
        {
            int x,y;
            Osopolar oso1=(Osopolar)mundo.getMartillo().getOneIntersectingObject(Osopolar.class);
            x=oso1.getX();
            y=oso1.getY();
            oso1.setSangre(25);
            if(oso1.getDireccion()==DERECHA)
            {
                oso1.setLocation(oso1.getX()+45,oso1.getY());
            }
            else
            {
                oso1.setLocation(oso1.getX()-45,oso1.getY());
            }

            if(oso1.getSangre()<=0)
            {
                martillazo.play();
                getWorld().removeObject(oso1);
                mundo.getCartelPuntos().add(100);
                if(Greenfoot.getRandomNumber(2)==1)
                {
                    Bombas pack=new Bombas();
                    getWorld().addObject(pack,x,y);
                }
                numOsosMuertos+=1;
            }

        }

    }

    /**metodo que regresa el numero de focas muertas*/
    /**@return regresa un entero int con el numero actual de focas muertas*/
    public int getNumFocasMuertas()
    {
        return numFocasMuertas;    
    }
    /**metodo para modificar el valor de las focas muertas*/
    /**@param recibe un entero int que sera el nuevo valor del numero de focas muertas*/
    public void setNumFocasMuertas(int fm)
    {
        numFocasMuertas=fm;    
    }
    /**metodo que regresa el numero de osos muertos*/
    /**@return regresa un entero int con el numero actual de osos muertos*/
    public int getNumOsosMuertos()
    {
        return numOsosMuertos;    
    }
    /**metodo para modificar el valor de los osos muertos*/
    /**@param recibe un entero int que sera el nuevo valor del numero de osos muertos*/
    public void setNumOsosMuertos(int om)
    {
        numOsosMuertos=om;    
    }
    /**metodo que regresa un entero int con el numero de Terodactilos muertos*/
    /**@return regresa un entero int con el numero actual de terodactilos muertos*/
    public int getNumTerodactilosMuertos()
    {
        return numTerodactilosMuertos;    
    }
    /**metodo para modificar el valor de los terodactilos muertos*/
    /**@param recibe un entero int que sera el nuevo valor del numero de terodactilos muertos*/
    public void setNumTerodactilosMuertos(int tm)
    {
        numTerodactilosMuertos=tm;    
    }

    /**metodo para aumentar 1 muerte en el numero de focas muertas cuando se invoque*/
    public void aumentaFocasMuertas()
    {
        numFocasMuertas+=1; 
    }

    /**metodo para aumentar 1 muerte en el numero de osos muertos cuando se invoque*/
    public void aumentaOsosMuertos()
    {
        numOsosMuertos+=1; 
    }

    /**metodo para aumentar 1 muerte en el numero de terodactilos muertos cuando se invoque*/
    public void aumentaTerodactilosMuertos()
    {
        numTerodactilosMuertos+=1; 
    }
    /**metodo para saber asignar que si se lleva una llave*/
    /**@param recibe un booleano en cualquiera de los casos si se lleva consigo una llave*/
    public void setTengoLlave(boolean unaRespuesta)
    {
        tengoLlave=unaRespuesta;
    }
    /**metodo para saber asignar que si se lleva una llave*/
    /**@param recibe un booleano en cualquiera de los casos si se lleva consigo una llave*/
    public void setTengoLlave2(boolean unaRespuesta)
    {
        tengoLlave2=unaRespuesta;
    }
    /**metodo que regresa la direccion*/
    /**@return regresa un entero int con el varo de la direccion del personaje*/
    public int getDireccion()
    {
        return direccionPopo;
    }

    /**metodo para borrar la primera parte de niveles*/
    public void borraMundo()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();
        List lista=mundo.getObjects(Baseizq.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Baseder.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Obstaculo.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Puerta.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Enemigo.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Llave.class);
        mundo.removeObjects(lista);

        //construye etapa 2
        setLocation(mundo.getWidth()/2,mundo.NIVEL1);

        Piso6 piso6=new Piso6();
        mundo.addObject(piso6,5,593);

        Piso8 piso8=new Piso8();
        mundo.addObject(piso8,350,mundo.NIVEL3+34);

        Piso9 piso9=new Piso9();
        mundo.addObject(piso9,170,mundo.NIVEL5);

        Pisobloque pisobloque1=new Pisobloque();
        mundo.addObject(pisobloque1,5,518);

        Base1der base1der = new Base1der();
        mundo.addObject(base1der, 860, 555);
        Base1izq base1izq = new Base1izq();
        mundo.addObject(base1izq, 40, 556);

        Base2der base2der = new Base2der();
        mundo.addObject(base2der, 857, 481);
        Base2izq base2izq = new Base2izq();
        mundo.addObject(base2izq, 42, 482);

        Base3der base3der = new Base3der();
        mundo.addObject(base3der, 832, 369);
        Base3izq base3izq = new Base3izq();
        mundo.addObject(base3izq,70, 369);

        Base4der base4der = new Base4der();
        mundo.addObject(base4der, 827, 219);
        Base4izq base4izq = new Base4izq();
        mundo.addObject(base4izq, 68, 219);

        Base5der base5der = new Base5der();
        mundo.addObject(base5der, 827, 68);
        Base5izq base5izq = new Base5izq();
        mundo.addObject(base5izq, 68, 68);

        Plataforma plata1=new Plataforma();
        mundo.addObject(plata1,mundo.getWidth()/2,519);

        Plataforma2 plata2=new Plataforma2();
        mundo.addObject(plata2,mundo.getWidth()/2,376);

        Plataforma plata3=new Plataforma();
        mundo.addObject(plata3,225,mundo.NIVEL3+34);

        Plataforma plata4=new Plataforma();
        mundo.addObject(plata4,672,mundo.NIVEL3+34);

        Plataforma plata5=new Plataforma();
        mundo.addObject(plata5,220,144);

        Plataforma plata6=new Plataforma();
        mundo.addObject(plata6,680,144);

        Plataforma2 plata7=new Plataforma2();
        mundo.addObject(plata7,225,77);

        Plataforma2 plata8=new Plataforma2();
        mundo.addObject(plata8,672,77);

        Plataforma plata9=new Plataforma();
        mundo.addObject(plata9,mundo.getWidth()/2,226);

        Puerta puerta = new Puerta();
        mundo.addObject(puerta, 445, 41);

        mundo.setEtapa(2);

    }
    
    /**metodo para borrar el nivel 2 y pasar al siguiente nivel*/
    public void borraMundo2()
    {
        MundoIceClimber mundo=(MundoIceClimber)getWorld();
        List lista=mundo.getObjects(Baseizq.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Baseder.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Obstaculo.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Puerta.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Enemigo.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Llave.class);
        mundo.removeObjects(lista);
        lista=mundo.getObjects(Llave2.class);
        mundo.removeObjects(lista);

        //construye etapa 2
        PisoFinal piso=new PisoFinal();
        mundo.addObject(piso,5,593);
        setLocation(mundo.getWidth()/2-200,mundo.NIVEL1);
        mundo.setEtapa(3);

    }
}
